// 引入path模块
const path = require('path')

// 引入css
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

//引入HtmlWebpackPlugin包
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 引入MiniCssMinimizer 
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

// 引入 CopyWebpackPlugin 
const CopyWebpackPlugin = require('copy-webpack-plugin');


const config = {
  // 工作模式
  mode: 'development',
  // mode: 'production',

  // 入口
  entry: {
    userinfo: './src/js/userinfo.js',
    index: './src/js/index.js',
    reg: './src/js/reg.js',
    login: './src/js/login.js',
    addNote: './src/js/noteBook/addNote.js',
    // modifyNote: './src/js/modifyNote/modifyNote.js'
  },


  // 输出
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: 'js/[id]_bundle.js',
    clean: true,//表示每次编译前，先清空输入文件夹
  },


  // 插件
  plugins: [
    // MiniCssExtractPlugin插件的作用是生成独立的css配置文件
    new MiniCssExtractPlugin({
      //生成的文件名及路径
      filename: 'css/[id]_bundle.css'
    }),
    new HtmlWebpackPlugin({
      //设置生成的html主文件的模板地址。
      //在模板文件中插入对新生成的js文件的引用。
      template: './src/noteBook/addNote.html',
      //生成的文件名，默认是index.html
      filename: 'noteBook/addNote.html',
      chunks: ['addNote']//表示当前文件要使用的入口名称。
    }),
    // new HtmlWebpackPlugin({
    //   //设置生成的html主文件的模板地址。
    //   //在模板文件中插入对新生成的js文件的引用。
    //   template: './src/user/modifyNote.html',
    //   //生成的文件名，默认是index.html
    //   filename: 'modifyNote.html',
    //   chunks: ['modifyNote']//表示当前文件要使用的入口名称。
    // }),
    new HtmlWebpackPlugin({
      //设置生成的html主文件的模板地址。
      //在模板文件中插入对新生成的js文件的引用。
      template: './src/user/userinfo.html',
      //生成的文件名，默认是index.html
      filename: 'user/userinfo.html',
      chunks: ['userinfo']//表示当前文件要使用的入口名称。
    }),
    new HtmlWebpackPlugin({
      //设置生成的html主文件的模板地址。
      //在模板文件中插入对新生成的js文件的引用。
      template: './src/index.html',
      //生成的文件名，默认是index.html
      filename: 'index.html',
      chunks: ['index']//表示当前文件要使用的入口名称。
    }),

    new HtmlWebpackPlugin({
      //设置生成的html主文件的模板地址。
      //在模板文件中插入对新生成的js文件的引用。
      template: './src/reg.html',
      //生成的文件名，默认是index.html
      filename: 'reg.html',
      chunks: ['reg']//表示当前文件要使用的入口名称。
    }),
    new HtmlWebpackPlugin({
      //设置生成的html主文件的模板地址。
      //在模板文件中插入对新生成的js文件的引用。
      template: './src/login.html',
      //生成的文件名，默认是index.html
      filename: 'login.html',
      chunks: ['login']//表示当前文件要使用的入口名称。
    }),

    // 处理不需要webpack处理的资源有copy可用
    // new CopyWebpackPlugin({
    //   patterns: [
    //     {
    //       from: './src/images',
    //       to: 'images'
    //     },
    //   ]
    // })

  ],


  // 模块处理
  module: {
    rules: [
      {
        test: /\.css$/,
        //use后的处理组件运行顺序是从后向前
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            //从这里加载的来自于import的css文件向前再使用一级loader处理
            options: {
              importLoaders: 1
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [
                  [
                    'postcss-preset-env'
                  ],
                ],
              },
            },
          }



        ]
      },
      // js文件的配置
      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                '@babel/preset-env' //使用这个预设，会根据浏览器来选择插件转化ES5
              ]
            }
          }
        ]
      },
      //让js处理html模板文件
      {
        test: /\.htm$/,
        type: 'asset/source'
      },
      // 处理css样式中的所有图片
      {
        test: /\.(jpg|png|gif|jpeg)/,
        //强制生成独立文件
        // type:  'asset/resource' ,
        //强制不生成独立文件，以base64格式的压缩字符串
        // type:  'asset/inline' ,
        type: 'asset',
        parser: {
          dataUrlCondition: {
            maxSize: 1024 * 8
          }
        },
        generator: {
          filename: 'images/[contenthash][ext]'
        }
      },


    ]
  },


  // 优化
  optimization: {
    minimizer: [
      new CssMinimizerPlugin(),
      '...'
    ],
    // minimize: true//在开发阶段启用压缩
  },


  // 开发服务器
  devServer: {
    //端口号
    port: 80,
    //开启热更新
    hot: true,
    //打开服务器时自动开启浏览器访问
    open: true,
    //监控变化的文件的，被监控的文件只要发生变化，就会重新编译，自动刷新浏览器。
    watchFiles: ['./src/login.html',
      './src/reg.html',
      './src/index.html',
      './src/user/userinfo.html',
      './src/noteBook/addNote.html',
      // './src/user/modifyNote.html'
    ],
    // static: {
    //   //设置express服务器的根目录。
    //   directory: path.join(__dirname, 'dist'),
    // },

    proxy: {
      //请求地址中包含/api的就会被拦截，例如：'/api/getXXX'
      '/api': {
        // 真实的请求会被转发到 'http://127.0.0.1:3001'
        target: 'http://127.0.0.1:3000',
        //如果真实服务器地址是'/api/get?a=1&b=2'
        pathRewrite: { "^/api": "/api" },
        //发送请求头中host会设置成target
        changeOrigin: true
      }
    }
  },
  devtool: 'source-map'

}

module.exports = config;